﻿//在函数定义  void Print(int arr[][5], int r, int c)  中， int arr  后面的方括号 不能省略。原因如下：
//告知编译器数组结构：在C语言中，当把二维数组作为参数传递给函数时，
//需要在函数定义中指定数组第二维的大小（第一维可以省略）。
//int arr[][5]  这种写法，能够让编译器知道这个二维数组的列数是5，从而正确地计算数组元素的内存地址偏移量。
//如果省略方括号写成  void Print(int arr, int r, int c) ，编译器就无法得知数组的列数信息，
//在访问  arr[i][j]  时就无法正确定位内存中的元素位置，导致不可预测的行为。
//语法规则要求：C语言语法明确规定了在函数参数列表中声明二维数组时，必须以这种方式指明第二维的大小。
//这是C语言为了保证在函数调用时对数组参数的正确处理而制定的规则，所以从语法角度来说也不能省略。
//所以，为了保证函数能够正确处理传入的二维数组，这个方括号以及其中指定的列数不能省略。  

#include <stdio.h>
void Print(int arr[][5], int r, int c)
{
	int i = 0;
	for (i = 0;i < r;i++)
	{
		int j = 0;
		for (j = 0;j < c; j++)
		{
			printf("%d\n", arr[i][j]);
		}
	}
}


int main()
{
	int arr[3][5] = { 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15 };
	Print(arr, 3, 5);


	return 0;
}

//“void Print(int, int, int)”: 无法将参数 1 从“int[3][5]”转换为“int”
//意思是：
//
//
//这报错信息意思是：在  Print  函数调用时，无法将  int[3][5]  类型的参数（也就是你定义的二维数组  arr ）转换为  int  类型。
//函数定义  void Print(int arr[][5], int r, int c)  时，规定了第一个参数是二维数组类型，省略  arr  后面括号，
//函数就期望第一个参数为  int  类型。但在  main  函数里  Print(arr, 3, 5) ， 
//arr  是  int[3][5]  二维数组，与函数期望的  int  类型不匹配，导致编译错误 。所以在函数定义里不能随意省略二维数组参数的括号。
